#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@File    :   main.py
@Time    :   2023/10/10 22:50:58
@Author  :   Li Ruilong
@Version :   1.0
@Contact :   liruilonger@gmail.com
@Desc    :   adaface demo 通过预训练模型获取合适人脸
"""

# here put the import lib


import net
import torch
import numpy as np
import yaml_utils as Yaml
import utils
from imutils import paths
class AdaFaceFeature:
    """
    @Time    :   2023/10/10 22:52:55
    @Author  :   liruilonger@gmail.com
    @Version :   1.0
    @Desc    :   AdaFace 人脸特征值预测
    """
    __instance = None
    
    def __new__(cls, *args, **kwargs):

        if cls.__instance is None:
            cls.__instance = super().__new__(cls)
        return cls.__instance

    def __init__(self,file_name="config/config.yaml") -> None:
        """
        @Time    :   2023/10/10 22:54:19
        @Author  :   liruilonger@gmail.com
        @Version :   1.0
        @Desc    :   初始化配置
        """
        self.config = Yaml.get_yaml_config(file_name)
        self.adaface_config = self.config['adaface']['zero']
        self.adaface_models = {self.adaface_config['model']: self.adaface_config['model_file'],}
        pass

    def load_pretrained_model(self):
        """
        @Time    :   2023/10/10 23:03:07
        @Author  :   liruilonger@gmail.com
        @Version :   1.0
        @Desc    :   加载模型
        """
        
        # load model and pretrained statedict
        architecture = self.adaface_config['model']
        assert architecture in self.adaface_models.keys()
        model = net.build_model(architecture)
        statedict = torch.load(
            self.adaface_models[architecture], map_location=torch.device('cpu'))['state_dict']
        model_statedict = {key[6:]: val for key,
                           val in statedict.items() if key.startswith('model.')}
        model.load_state_dict(model_statedict)
        model.eval()
        self.model = model
        return self



    def to_input(self,pil_rgb_image):
        """
        @Time    :   2023/10/10 23:08:09
        @Author  :   liruilonger@gmail.com
        @Version :   1.0
        @Desc    :   PIL RGB图像对象转换为PyTorch模型的输入张量
        """
        tensor = None
        try:
            np_img = np.array(pil_rgb_image)
            brg_img = ((np_img[:, :, ::-1] / 255.) - 0.5) / 0.5
            tensor = torch.tensor([brg_img.transpose(2, 0,1)]).float()
        except Exception :
            return tensor    
        return tensor




    def b64_get_represent(self,path):
        """
        @Time    :   2023/10/10 23:12:19
        @Author  :   liruilonger@gmail.com
        @Version :   1.0
        @Desc    :   获取脸部特征向量
        """
        
        feature = None
        
        aligned_rgb_img =  utils.get_base64_to_Image(path).convert('RGB')
        bgr_tensor_input = self.to_input(aligned_rgb_img)
        if bgr_tensor_input is not None:
            feature, _ = self.model(bgr_tensor_input)
        else:
           print(f"无法提取脸部特征向量 🥷🥷🥷")     
        return feature
    

    def byte_get_represent(self,path):
        """
        @Time    :   2023/10/10 23:12:19
        @Author  :   liruilonger@gmail.com
        @Version :   1.0
        @Desc    :   获取脸部特征向量
        """
        
        feature = None
        
        aligned_rgb_img =  utils.get_byte_to_Image(path).convert('RGB')
        bgr_tensor_input = self.to_input(aligned_rgb_img)
        if bgr_tensor_input is not None:
            feature, _ = self.model(bgr_tensor_input)
        else:
           print(f"无法提取脸部特征向量 🥷🥷🥷")     
        return feature
    

    def findCosineDistance(self,source_representation, test_representation):
        """
        @Time    :   2023/06/16 12:19:27
        @Author  :   liruilonger@gmail.com
        @Version :   1.0
        @Desc    :   计算两个向量之间的余弦相似度得分
        """
        import torch.nn.functional as F
        return F.cosine_similarity(source_representation, test_representation)
    




if __name__ == '__main__':
    print("获取特征开始")
    adaface =  AdaFaceFeature()
    adaface.load_pretrained_model()
    #处理过的人脸照片，以做面部对齐处理,大小： 112*112
    dir_path = "./mtcnn/"
    #byte 测试
    for img_path  in paths.list_images(dir_path):
        feature = adaface.byte_get_represent(utils.get_image_path_to_byte(img_path))
        print(utils.feature2json(feature))
        

    # b64 测试
    for i in range(0,100):
        pass
        #feature =  adaface.b64_get_represent("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HnabzXaz2dUoyBDlnNerrvGubcJut9tut2mKp5fj0zDCGFlVUrLErbMOAUtGKZJSjolENRetzR3L/8k5a6011jbelyLOWG+s5FRAGYAvSlRUtagUBVLQcnFFQQvUl/8uQW9vd//0n373n/7w07/88x9/+umnVdfFeS65AOE8z6radZ1x1lobQogxao7IGOdIgDfb/W67ddaWnH/561///Kc//+nf//zycjyf+269N+fTQSTnUmIRQ4gibG0DRBjRoHHsfXDWkaoWaRu/2YTb293b+/3bh/12t1+t1pJEspQ09ie7akzwfrvZ3t7dh9A8f31adSvrTqAnhxAQ1m1ogy8pas5Yisakc7SqnIsVCEQGMRnOvtLTeudCaGKMtX1BL6lQLFr7BUoBSAoCiiq4hCAgsESTv76IcLtpvLc//+79P//LH//LP//xn//pj/vtJuf88vLifDDGliLWuqZpFTA0wVo7jmPWIiDn83kcx3a1AoBxHOd5/vTp85//9JfPn79M02yMe/fugzmfTyI5lSIIBGoQ7/bbzXZLhtCAkgKQqOY4E8BqtVqvu9vbm4f7u5ubm+122zZNSbmkPPT+0DITe+s2K79uXcnRsBpLhklybhk846oNwbl5nlPONUlhUBWBcvEAHRvDbHxoiIsKFQlIjbGas2EGrGEp5CyqxRIaYsRCAEWW5pnv8fhrEwTAhgHAO/Nwv3n7Zv/P/+mnP/7h548fP7x7+5YQjsfjMIylKFJUgbZpn+k4DsecwfBhmrIgKEpKU0qplDxN0zhN5/P5T3/681/++tdxnAzb+7s3P/z4O3M8neYpl5wdoTO06cIP7x5++unHZuXZMSACUsppHPucozEuhHa/393c3G426/V6DapTKvM8p5SsNcG5YO268+vOHg4TQlTIpWSz5FvBWsOMMcaccymFCbrgYkw5ZWY2TJbIOR+QxmmCokHRqwISWDchnbNiAQEV1Op0MqExqIr5ks3BSwHjNYV363a/39zerN887H784c3vfv/jjz/88OH9h/u7u8PhRVWZ2TqXl0+hnPV4HJGmcUgunNk6RCySkJS5Zz68HJ+Px+d//48/ffr0GQB2u93d/Zt37z6YcZxiUsjSWG4bc39/8/79ux9//LjZrVabhpmttTFO43wep6kUQeS2bVdd07Shbf08TiI5xlhKcVVCvQ8heO+lPIMW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")
        #print(utils.feature2byte(feature))
        #print(utils.feature2json(feature))
